/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Base;

import java.util.ArrayList;
import static java.lang.Math.cos;
import static java.lang.Math.toRadians;
import static java.lang.Math.sin;

/**
 *
 * @author atxy2k
 */
public class Transform {
    private ArrayList<Point> list;
    private double degress = toRadians(3);
    /**
     * 
     * @param list Una lista de objetos Point(x,y) para realizar las transformaciones
     */
    public Transform(ArrayList<Point> list) {
        this.list = list;
    }
    //Traslation
    /**
     * Mover hacia arriba el poligono
     */
    public void moveUp(){
       for (int i = 0; i < list.size(); i++) {
            list.get(i).setY(list.get(i).getY()+0.1F);
        }
    }
    /**
     * Mover hacia abajo el poligono 
     */
    public void moveDown(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setY(list.get(i).getY()-0.1F);
        }
    }
    /**
     * Mover hacia la izquierda el poligono
     */
    public void moveLeft(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()-0.1F);
        }
    }
    /**
     * Mover hacia la derecha el poligono
     */
    public void moveRight(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()+0.1F);
        }
    }
    /**
     * Mover hacia el noreste el poligono
     */
    public void moveRightUp(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()+0.1F);
            list.get(i).setY(list.get(i).getY()+0.1F);
        }
    }
    /**
     * Mover hacia el noroeste el poligono
     */
    public void moveLeftUp(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()-0.1F);
            list.get(i).setY(list.get(i).getY()+0.1F);
        }
    }
    /**
     * Mover hacia suroeste el poligono
     */
    public void moveLeftDown(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()-0.1F);
            list.get(i).setY(list.get(i).getY()-0.1F);
        }
    }
    /**
     * Mover hacia el sureste el poligono
     */
    public void moveRightDown(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()+0.1F);
            list.get(i).setY(list.get(i).getY()-0.1F);
        }
    }
    // Scaling from the Point 0
    /**
     * Incrementando el poligono respecto al punto cero
     */
    public void increment(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()*1.1F);
            list.get(i).setY(list.get(i).getY()*1.1F);
        }
    }
    /**
     * Decrementando el poligono respecto al punto cero
     */
    public void decrement(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()*0.9F);
            list.get(i).setY(list.get(i).getY()*0.9F);
        }
    }
    //Scaling from a fixed point
    /**
     * Incrementando el poligono desde un punto fijo
     */
    public void increment(Point p){
        float sx = 1.1F;
        float px = p.getX();
        float py = p.getY();
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(sx *(list.get(i).getX()-px)+px);
            list.get(i).setY(sx *(list.get(i).getY()-py)+py);
        }
    }
    /**
     * Decrementando el poligono respecto a un punto fijo
     */
    public void decrement(Point p){
        float sx = 0.9F;
        float px = p.getX();
        float py = p.getY();
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(sx *(list.get(i).getX()-px)+px);
            list.get(i).setY(sx *(list.get(i).getY()-py)+py);
        }
    }
    //Rotation from the Point 0
    /**
     * Rotando hacia la izquierda respecto al punto cero
     */
    public void rotationLeft(){
        for (int i = 0; i < list.size(); i++) {
            double px = (list.get(i).getX()*cos(degress) - (list.get(i).getY()*sin(degress)));
            double py = (list.get(i).getY()*cos(degress) + (list.get(i).getX()*sin(degress)));
            list.get(i).setX((float)px);
            list.get(i).setY((float)py);
        }
    }
    /**
     * Rotando hacia la derecha respecto al punto cero
     */
    public void rotationRight(){
        for (int i = 0; i < list.size(); i++) {
            double px = (list.get(i).getX()*cos(-degress) - (list.get(i).getY()*sin(-degress)));
            double py = (list.get(i).getY()*cos(-degress) + (list.get(i).getX()*sin(-degress)));
            list.get(i).setX((float)px);
            list.get(i).setY((float)py);
        }
    }
    //Rotation from a fixed point
    /**
     * Rotando hacia la izquierda desde un punto fijo
     */
    public void rotationLeft(Point p){
        double px;
        double py ;
        for (int i = 0; i < list.size(); i++) {
            px = (p.getX()+(list.get(i).getX()-p.getX())*cos(degress) - (list.get(i).getY()-p.getY())*sin(degress));
            py = (p.getY()+(list.get(i).getY()-p.getY())*cos(degress) + (list.get(i).getX()-p.getX())*sin(degress));
            list.get(i).setX((float)px);
            list.get(i).setY((float)py);
        }
    }
    /**
     * Rotando hacia la derecha respecto a un punto fijo
     */
    public void rotationRight(Point p){
        double px;
        double py ;
        for (int i = 0; i < list.size(); i++) {
            px = (p.getX()+(list.get(i).getX()-p.getX())*cos(-degress) - (list.get(i).getY()-p.getY())*sin(-degress));
            py = (p.getY()+(list.get(i).getY()-p.getY())*cos(-degress) + (list.get(i).getX()-p.getX())*sin(-degress));
            list.get(i).setX((float)px);
            list.get(i).setY((float)py);
        }
    }
    //Reflection
    /**
     * Realizando reflexion respecto al eje X
     */
    public void reflectionInX(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setX(list.get(i).getX()*-1);
        }
    }
    /**
     * Realizando reflexion respecto al eje Y
     */
    public void reflectionInY(){
        for (int i = 0; i < list.size(); i++) {
            list.get(i).setY(list.get(i).getY()*-1);
        }
    }
}
